
// 获得指定属性(property)的描述符(descriptor)

let user = {
    id: 10010,
    name: '联通用户'
}

console.log( user );

// Object.getOwnPropertyDescriptor( object, name )
// 获得指定对象(object)的指定属性(name)的描述符(descriptor)

let idDescriptor = Object.getOwnPropertyDescriptor( user , 'id' );
console.log( idDescriptor );

console.log( '- '.repeat( 20 ) );

// 修改已有属性的描述符(descriptor)
Object.defineProperty( user , 'id' , {
    value: user.id ,
    configurable: false ,
    enumerable: false,
    writable: false
});

idDescriptor = Object.getOwnPropertyDescriptor( user , 'id' );
console.log( idDescriptor );

console.log( user );
// Object.property.propertyIsEnumerable( name ) 判断属性在当前对象中是否可枚举
console.log( user.propertyIsEnumerable( 'id' ) ); // false

// Object.property.hasOwnProperty( name ) 判断属性是否是当前对象的自有属性
console.log( user.hasOwnProperty( 'id' ) ); // true
console.log( 'id' in user ); // true : 判断 id 是否存可以通过 user 来访问

console.log( '- '.repeat( 20 ) );

// 通过 user 来访问 id 、name 属性
console.log( user.id , user.name );

console.log( '- '.repeat( 20 ) );

// 用 for ... in 循环 遍历对象
for( let property in user ){
    // 对于不可被枚举的属性是无法通过 for...in 循环来遍历的
    console.log( property , user[ property ] );
}

console.log( '- '.repeat( 20 ) );

// 通过 Object.getOwnPropertyNames 可以获得某对象中所有自有属性名组成的数组
let names = Object.getOwnPropertyNames( user );
console.log( names );